Welcome to EOELAB!

EOELAB 用户手册

EOELAB 用户手册

本文档面向 EOELAB 用户,说明如何注册账户、接入联邦网络并使用计算和对象存储等联邦设施。维护者同样先以用户身份完成账户和网络接入,再参考《EOELAB 运维手册》部署和维护设施。

阅读导览

账户

账户注册

  1. 打开《EOELAB 服务端点》列出的 Zitadel,自主注册或使用 GitHub 创建账户
  2. 完成账户注册后即成为 EOELAB 成员,无需 admin 团队审核
  3. 通过外部身份提供商创建的账户可能没有本地密码;需要本地密码时联系 admin 团队设置

成员可以立即将设备加入联邦网络。成员身份提供网络接入资格,不自动授予 Incus 资源、RustFS 数据或 Headplane 管理权限;这些能力继续由对应服务管理。

账户安全

联邦网络

接入网络

  1. 下载 Tailscale 客户端:https://tailscale.com/download
  2. 从《EOELAB 服务端点》取得 Headscale 地址并执行:
    HEADSCALE_ENDPOINT='<HEADSCALE_ENDPOINT>'
    sudo tailscale up --login-server "$HEADSCALE_ENDPOINT"
    
  3. 按浏览器提示使用 EOELAB 账户登录
  4. 执行 tailscale status 确认设备在线

节点加入后使用自动生成的 HOSTNAME.eoelab 名称通信。重装系统或清除 Tailscale 状态后需要重新注册。

在云服务器上激活客户端后,内部镜像域名可能解析到 CGNAT 地址。如软件源不可用,可临时改用公网站点,例如 USTC 镜像源。

管理自己的节点

用户可以打开《EOELAB 服务端点》列出的 Headplane,查看和管理自己有权操作的节点。网络管理角色、能力和限制统一参见《EOELAB 权限模型》。

计算服务

Incus 使用 Zitadel OIDC 登录,并通过 OpenFGA 控制用户可以访问的项目、实例和其他资源。Incus Web UI 是公网管理入口;节点 SSH、实例 proxy 端口和其他节点直连入口只在联邦网络内提供。角色和细粒度权限说明参见《EOELAB 权限模型》。

实例访问

  1. 通过《EOELAB 服务端点》列出的公网 Incus Web UI,使用 terminal 或 console 操作实例
  2. 需要使用 SSH 或 SCP 时:
    1. 将设备接入联邦网络
    2. 由维护者通过 proxy 设备配置 SSH 端口,并绑定到 Incus 节点的 Tailscale 接口
    3. 使用《EOELAB 服务端点》列出的 .eoelab 节点名称和分配端口连接
    4. 通过 terminal 将公钥写入实例
    5. 启动 SSH 服务:
      • Debian 系:service ssh start
      • Alpine 系:/usr/sbin/sshd
    6. 使用 SSH 或 SCP 连接

嵌套 OCI 容器

默认不允许在 LXC 中嵌套运行 OCI 容器。容器化服务应直接以 OCI 实例运行在 Incus 上,并使用 Incus 网络通信。CI/CD 构建镜像时可以使用 Kaniko。

对象存储

EOELAB 对象存储由 RustFS 提供,兼容 S3,并提供 Console 和 WebDAV 接口。具体地址统一参见《EOELAB 服务端点》。Console 是公网管理入口;S3 和 WebDAV 只通过联邦网络提供,使用前必须先接入 Tailscale。

登录 Console

  1. 打开《EOELAB 服务端点》列出的 RustFS Console
  2. 选择 OIDC 登录
  3. 使用 EOELAB Zitadel 账户完成认证

Console 中创建的 Access Key 是独立的长期凭证,用于 rc、S3 SDK 和 WebDAV。Secret Key 通常只在创建时显示一次,应立即存入密码管理器。

Bucket 命名

每个用户只能管理以下名称的 Bucket:

<sub>
<sub>-*

sub 是 Zitadel 为账户分配的稳定用户 ID,可以在 Zitadel 用户资料中查看,或向 admin 团队查询。例如 sub 为 123456 时,可以创建 123456、123456-backup 和 123456-project-a,不能创建 backup。

Bucket 名称必须符合 S3 命名规则:使用小写字母、数字、点和连字符,不能包含空格或下划线。

创建 Access Key

  1. 在 Console 打开 Access Keys
  2. 选择创建 Access Key
  3. 根据用途填写名称、说明和有效期;除非确有长期使用需求,否则必须设置有效期
  4. 保存 Access Key 和 Secret Key

Access Key 继承当前用户的权限边界。即使为 Access Key 配置额外策略,也不能突破用户自己的 Bucket 范围。

安装 rc

从 https://github.com/rustfs/cli/releases 下载与操作系统和处理器架构匹配的发布包。以 Linux amd64 为例:

tar -xzf rustfs-cli-linux-amd64-vVERSION.tar.gz
sudo install -m 0755 rc /usr/local/bin/rc
rc --version

将 VERSION 替换为下载的版本号。安装后的命令名为 rc。

配置 rc

接入联邦网络后,从《EOELAB 服务端点》取得 RustFS S3 地址,并使用 Console 创建的 Access Key 和 Secret Key 配置别名:

S3_ENDPOINT='<S3_ENDPOINT>'
rc alias set oss "$S3_ENDPOINT" ACCESS_KEY SECRET_KEY

不要将包含真实 Secret Key 的命令提交到 Shell 脚本、Git 仓库、工单或聊天记录中。

常用操作:

# 列出可访问的 Bucket
rc ls oss/

# 创建 Bucket
rc mb oss/SUB
rc mb oss/SUB-project

# 上传文件或目录
rc cp ./example.txt oss/SUB-project/
rc cp -r ./dataset/ oss/SUB-project/dataset/

# 下载文件
rc cp oss/SUB-project/example.txt ./example.txt

# 删除空 Bucket
rc rb oss/SUB-project

将示例中的 SUB 替换为自己的 Zitadel sub。

Access Key 生命周期

Access Key 到期后立即停止认证。RustFS 在后续加载该身份时自动删除过期的 Service Account 记录和关联策略,因此正常轮换可以通过设置有效期完成,不需要在到期后手动清理服务端记录。

需要提前撤销时,先查看自己名下的 Access Key:

rc admin service-account ls oss

删除指定 Access Key:

rc admin service-account rm oss ACCESS_KEY

如果删除的是当前 oss Alias 使用的 Access Key,服务端删除成功后再清理本地 Alias:

rc alias remove oss

rc alias remove 只删除本地配置,不会撤销 RustFS 服务端凭证。必须先执行 rc admin service-account rm,再删除本地 Alias。

使用其他 S3 客户端

支持自定义 S3 Endpoint 的客户端使用以下配置:

Endpoint: <S3_ENDPOINT>
Access Key: Console 创建的 Access Key
Secret Key: Console 创建的 Secret Key
Region: us-east-1
Path Style: 按客户端兼容性需要启用
TLS: 关闭;应用流量由 Tailscale 加密

S3 不提供公网端点。流量通过 Tailscale 网络传输,应用身份认证仍由 Access Key 和 Secret Key 完成。

使用 WebDAV

接入联邦网络后,从《EOELAB 服务端点》取得 WebDAV 地址。用户名填写 Access Key,密码填写 Secret Key。WebDAV 不提供公网端点,也不支持 OIDC/STS 临时凭证,因为 Basic Auth 无法携带 Session Token。

建议在连接地址中显式填写 Access Key,避免客户端继续使用缓存的旧用户名:

http://<ACCESS_KEY>@oss.eoelab:8080/[<BUCKET>/]

[<BUCKET>/] 表示可选路径。省略时从 WebDAV 根目录开始并列出当前 Access Key 可访问的 Bucket;填写时直接进入指定 Bucket。由于 Access Key 已经作为用户名写入地址,客户端可能只显示密码输入框,此时填写对应的 Secret Key 即可。

WebDAV 根路径列出当前 Access Key 可访问的 Bucket,Bucket 和对象路径对应如下:

http://<ACCESS_KEY>@oss.eoelab:8080/                      Bucket 列表
http://<ACCESS_KEY>@oss.eoelab:8080/<BUCKET>/             指定 Bucket
http://<ACCESS_KEY>@oss.eoelab:8080/<BUCKET>/<OBJECT>     指定对象

不要直接用网页浏览器验证 WebDAV。浏览器访问根地址时发送普通 GET /,服务端返回 405 Method Not Allowed 属于正常现象。可以使用以下命令验证;命令会交互式询问 Secret Key,避免将其写入 Shell 历史:

ACCESS_KEY='<ACCESS_KEY>'
curl --user "$ACCESS_KEY" -X PROPFIND -H 'Depth: 1' '<WEBDAV_ENDPOINT>/'

成功时返回 207 Multi-Status。常见客户端配置如下:

客户端地址认证
GNOME Files将 <WEBDAV_ENDPOINT> 的 http:// 替换为 dav://,并在主机名前加入 <ACCESS_KEY>@;Bucket 路径可选地址中提供 Access Key,密码为 Secret Key
macOS Finder在 <WEBDAV_ENDPOINT> 的主机名前加入 <ACCESS_KEY>@;Bucket 路径可选地址中提供 Access Key,密码为 Secret Key
Windows、Cyberduck、rclone 等WebDAV 地址可填写根路径或指定 Bucket 路径显式将 Access Key 设为用户名,Secret Key 设为密码

只读 Access Key 可以列目录和下载对象,不能上传、创建目录、重命名或删除。WebDAV 的 HTTP 明文流量由 Tailscale 加密,仍须使用 Access Key 和 Secret Key 完成应用身份认证。

S3 Tables

获得相应权限的用户可以在 Console 的 S3 Tables 页面启用自己的 Bucket,并管理 Namespace、Table 和 View。Table 操作仍受 <sub> 和 <sub>-* 的 Bucket 边界限制。

常见问题

首次访问时 rc ls 报错

第一次访问对象存储时,必须先创建一个符合命名规则的 Bucket,再执行 rc ls oss/。如果当前 Access Key 尚无可访问的 Bucket,直接执行 rc ls oss/ 会报错。

rc mb oss/SUB
rc ls oss/

将 SUB 替换为自己的 Zitadel sub。

502 Bad Gateway

如果客户端配置了 HTTP 代理,.eoelab 请求可能被错误发送到代理。将内部域名加入代理绕过列表:

export NO_PROXY="${NO_PROXY:+${NO_PROXY},}.eoelab"
export no_proxy="${no_proxy:+${no_proxy},}.eoelab"

可以使用以下命令进行单次验证:

NO_PROXY='*' no_proxy='*' rc ls oss/

AccessDenied

依次检查:

  1. Bucket 名称是否为自己的 <sub> 或 <sub>-*
  2. Access Key 是否属于当前用户且未被禁用或过期
  3. Access Key 的附加策略是否进一步缩小了权限
  4. 设备是否已接入联邦网络

SignatureDoesNotMatch

检查 Endpoint、Access Key、Secret Key 和系统时间。复制凭证时不要包含额外空格或换行。

Console 中没有创建 Bucket 按钮

当前 Console 可能无法识别包含动态用户变量的 Bucket Resource。可以改用 rc mb 创建符合命名规则的 Bucket;后端仍会执行完整的权限检查。

镜像仓库

EOELAB 提供 Docker Hub 镜像入口,具体地址参见《EOELAB 服务端点》。由于 Cloudflare Worker 的匿名拉取额度已经达到上限,使用该入口前必须通过 Docker Hub 账户登录,不支持匿名拉取。

docker login dhcr.eoelab.org

按提示输入 Docker Hub 用户名和密码或 Access Token。这里使用的是 Docker Hub 账户,不是 EOELAB Zitadel 账户。

自托管 Runner

  1. 在 Codeberg Actions 页面创建新的 Runner
  2. 将以下信息发送给 admin 团队:
    connections:
      forgejo:
        url: https://codeberg.org/
        uuid: UUID
        token: TOKEN
    

实际注册时,维护者会将 forgejo 替换为申请人的用户名,用于内部区分并避免同名 key 冲突。

退出与数据清理

EOELAB 不支持静默退出。需要退出时向 admin 团队发送退出申请,并提前说明需要导出的配置和数据。admin 团队将移除账户、节点和联邦权限,并与用户确认必要的数据交付和清理范围。

长期失联或存在安全风险的账户和节点可能被强制移除。

Post list